﻿/*
 * Created by SharpDevelop.
 * User: Lousabit
 * Date: 05/10/2011
 * Time: 16:39
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
using Business_Entity;
using DAOFactory;

namespace DAOFactory
{
	/// <summary>
	/// Description of DAOPedidoVenta.
	/// </summary>
	public class DAOPedidoVenta
	{
		public DAOPedidoVenta()
		{
		}
		
		public static void llenarDuracionDeLineasServicio(List<BELineaPedidoServicio> lineas){
			
			foreach(BELineaPedidoServicio linea in lineas){
				BEServicio buscar = new BEServicio();
				buscar.Codigo = linea.Servicio.Codigo;
				

				DAOServicio daoServ = new DAOServicio();
				List<BEServicio> servicios = daoServ.buscarListaServicios();
				
				linea.Servicio.Duracion = 0;
				try{
					
					foreach(BEServicio s in servicios){
						if (s.Codigo == linea.Servicio.Codigo){
							linea.Servicio.Duracion = s.Duracion;
							break;
						}
					}
					
				}catch(Exception ex){
					//
				}
				
			}
			
		}
		
		public static BEPedidoVenta getPedidoCompletoById(int id){
				
			BEPedidoVenta v = new BEPedidoVenta();
			v.Id = id;
			
			BECliente cliente = new BECliente();
			cliente.Id = -1;
			v.Cliente = cliente;
			
			v.Fecha = new DateTime(1,1,1);
			
			v.Estado = new BEEstadoPedidoVenta(-1, "No importa XD");
			
			List<BEPedidoVenta> lst = DAOPedidoVenta.find(v, new DateTime(1,1,1));
			v = lst[0];
			
			
			SqlDataReader reader;
			
			//LINEAS PRODUCTO			
			SqlCommand cmd = new SqlCommand("VENTAS_BUSCAR_LINEASPRODUCTO_J", ConnectionManager.getConnection());
			cmd.CommandType = CommandType.StoredProcedure;
			
			cmd.Parameters.Add("@idPedidoVenta", SqlDbType.Int);
			cmd.Parameters["@idPedidoVenta"].Value = id;
			
			reader = cmd.ExecuteReader();
			
			while(reader.Read()){
				int cantidad = (int)reader["cantidad"];
				double pU = (double)reader["precioUnitario"];
				int idLinea = (int)reader["idLinea"];
				int idProducto = (int)reader["idProducto"];
				String nombre = reader["nombreProducto"].ToString();
				BEProducto producto = new BEProducto();
				producto.Codigo = idProducto;
				producto.Nombre = nombre;
				
				BELineaPedidoProducto linea = new BELineaPedidoProducto(cantidad, pU, producto);
				linea.Id = idLinea;
				
				if ((int)reader["d_idDescuento"] == -1){
					linea.Descuento = null;
				}else{
					linea.Descuento = new BEDescuento();
					linea.Descuento.Id = (int)reader["d_idDescuento"];
					linea.Descuento.Descuento = (int)reader["d_porcentaje"];
					linea.Descuento.CantidadMinima = (int)reader["d_cantMinima"];
					try{
					linea.Descuento.CantidadMaxima = (int)reader["d_cantMaxima"];
					}catch(Exception ex){
						linea.Descuento.CantidadMaxima = -1;
					}
				}
								
				v.addLinea(linea);
			}
			reader.Close();
						
			
			//LINEAS SERVICIO
			DAOHelper daoHelper = new DAOHelper(
				@"VENTAS_BUSCAR_LINEASSERVICIO_J 
				@idPedidoVenta int"
			);
			
			reader = daoHelper.ExecuteReader(v.Id);
			while(reader.Read()){
				BELineaPedidoServicio l = new BELineaPedidoServicio();
				l.Id = (int)reader["idLinea"];
				l.Precio = double.Parse(reader["precio"].ToString());
				l.Fecha = (DateTime)reader["fecha"];
					
				l.Mascota = new BEMascota((int)reader["m_idMascota"], reader["m_nombre"].ToString());
				
				l.Tienda = new BETienda((int)reader["t_idTienda"], reader["t_nombre"].ToString(), reader["t_direccion"].ToString());
				
				l.Servicio = new BEServicio();
				l.Servicio.Codigo = (int)reader["s_idServicio"];
				l.Servicio.Descripcion = reader["s_descripcion"].ToString();
				l.Servicio.Precio = double.Parse(reader["precio"].ToString());
				
				l.Servicio.Tipo = new BETipoServicio((int)reader["ts_idTipoServicio"], reader["ts_descripcion"].ToString());
				
				//descuento
				if ((int)reader["d_idDescuento"] == -1){
					l.Descuento = null;
				}else{
					l.Descuento = new BEDescuento();
					l.Descuento.Id = (int)reader["d_idDescuento"];
					l.Descuento.Descuento = (int)reader["d_porcentaje"];
					l.Descuento.CantidadMinima = (int)reader["d_cantMinima"];
					try{
					l.Descuento.CantidadMaxima = (int)reader["d_cantMaxima"];
					}catch(Exception ex){
						l.Descuento.CantidadMaxima = -1;
					}
				}
				//descuento fin
				
				l.Empleado =new BEEmpleado((int)reader["e_idEmpleado"]);
				l.Empleado.Nombre = reader["e_nombre"].ToString();
				l.Empleado.ApPaterno = reader["e_apPaterno"].ToString();
				l.Empleado.ApMaterno = reader["e_apMaterno"].ToString();
				
				l.Estado = new BEEstadoAtencion((int)reader["est_idEstado"], reader["est_descripcion"].ToString());
				
				l.Observaciones = reader["observacion"].ToString();
				
				v.addLinea(l);
			}
			reader.Close();
						
			return v;
				
		}
		
		public static void eliminar(BEPedidoVenta pedido){
			DAOHelper h = new DAOHelper(
				@"VENTAS_ELIMINAR_PEDIDOVENTA_J 
				@idPedido int");
			h.ExecuteNonQuery(pedido.Id);
		}
		
		public static List<BEPedidoVenta> find(BEPedidoVenta pedidoVenta, DateTime fechaFin){
									
			SqlCommand cmd = new SqlCommand("VENTAS_BUSCAR_PEDIDOS_J", ConnectionManager.getConnection());
			cmd.CommandType = CommandType.StoredProcedure;
			
			cmd.Parameters.Add("@idPedido", SqlDbType.Int);
			cmd.Parameters["@idPedido"].Value = pedidoVenta.Id;

			cmd.Parameters.Add("@idCliente", SqlDbType.Int);
			cmd.Parameters["@idCliente"].Value = pedidoVenta.Cliente.Id;
			
			cmd.Parameters.Add("@idEmpleado", SqlDbType.Int);
			cmd.Parameters["@idEmpleado"].Value = -1;
			
			cmd.Parameters.Add("@idEstado", SqlDbType.Int);
			cmd.Parameters["@idEstado"].Value = pedidoVenta.Estado.Id;
			
			cmd.Parameters.Add("@fechaIni", SqlDbType.Date);
			cmd.Parameters["@fechaIni"].Value = pedidoVenta.Fecha.ToShortDateString();
			
			cmd.Parameters.Add("@fechaFin", SqlDbType.Date);
			cmd.Parameters["@fechaFin"].Value = fechaFin.ToShortDateString();
						
			
			SqlDataReader reader = cmd.ExecuteReader();
			
			List<BEPedidoVenta> lista = new List<BEPedidoVenta>();
			while(reader.Read()){
				BECliente cliente = new BECliente();
				cliente.Id = (int)reader["c_idCliente"];
				cliente.Nombre = reader["c_nombreCliente"].ToString();
				cliente.ApellidoPaterno = reader["c_apPat"].ToString();
				cliente.BeCategoriaCliente = new BECategoriaCliente((int)reader["c_idCategoria"],"CATEGORIA");
				
				BEEmpleado empleado = new BEEmpleado();
				empleado.IdEmpleado = (int)reader["e_idEmpleado"];
				empleado.Nombre = reader["e_nombre"].ToString();
				empleado.ApPaterno = reader["e_apPaterno"].ToString();
				empleado.ApMaterno = reader["e_apMaterno"].ToString();
				
				BEEstadoPedidoVenta estado = new BEEstadoPedidoVenta((int)reader["s_idEstado"], reader["s_descripcion"].ToString());
					
				BEPedidoVenta elem = new BEPedidoVenta((int)reader["p_idPedidoVenta"], (DateTime)(reader["p_fecha"]), estado, cliente);
				lista.Add(elem);
			}
			reader.Close();
			return lista;
			
			
		}
		
		public static void insert(BEPedidoVenta pedidoVenta){
			
			DAOHelper helper;
			
			helper = new DAOHelper(
				@"VENTAS_REGISTRAR_PEDIDOVENTA_J 
				@idPedido int,
				@idEstado int,
				@idCliente int,
				@idEmpleado int,
				@fecha DATE,
				@idTienda int,
				@id int output");

			helper.ExecuteNonQuery(
				-1,
				pedidoVenta.Estado.Id,
				pedidoVenta.Cliente.Id,
				pedidoVenta.Empleado.IdEmpleado,
				pedidoVenta.Fecha,
				pedidoVenta.Tienda.Id,
				null);
						
			pedidoVenta.Id = (int)(helper.getOutput("@id"));
			
			updateLineas(pedidoVenta, new List<BELineaPedidoProducto>(), new List<BELineaPedidoServicio>());

		}
		
		public static Boolean update(BEPedidoVenta v){
			try{
				String cmdStr = "VENTAS_REGISTRAR_PEDIDOVENTA_J";
				SqlCommand cmd = new SqlCommand(cmdStr, ConnectionManager.getConnection());
				cmd.CommandType = CommandType.StoredProcedure;
				
				cmd.Parameters.Add("@idPedido", SqlDbType.Int);
				cmd.Parameters["@idPedido"].Value = v.Id;
				
				cmd.Parameters.Add("@idEstado", SqlDbType.Int);
				cmd.Parameters["@idEstado"].Value = v.Estado.Id;
				
				cmd.Parameters.Add("@idCliente", SqlDbType.Int);
				cmd.Parameters["@idCliente"].Value = v.Cliente.Id;
				
				cmd.Parameters.Add("@idEmpleado", SqlDbType.Int);
				cmd.Parameters["@idEmpleado"].Value = -1;//v.Empleado.IdEmpleado;
				
				cmd.Parameters.Add("@fecha", SqlDbType.Date);
				cmd.Parameters["@fecha"].Value = v.Fecha;
				
				cmd.Parameters.Add("@error", SqlDbType.Int);
				cmd.Parameters["@error"].Direction = ParameterDirection.Output;
				
				cmd.ExecuteNonQuery();
				
				int error = (int)cmd.Parameters["@error"].Value;
				
				if (error == 1){
					MessageBox.Show("Error al ejecutar Stored Procedure");
					return false;
				}
				
				return true;
			}catch(Exception ex){
				MessageBox.Show("Error\n"+ex);
				return false;
			}
		}
		
		public static void updateLineas(BEPedidoVenta v, List<BELineaPedidoProducto> lineasProdElim, List<BELineaPedidoServicio> lineasServElim){
			
			DAOHelper daoHelper;
			
			//primero eliminar las lineas que se deban eliminar
			SqlCommand cmd;
			
			foreach(BELineaPedidoProducto linea in lineasProdElim){
				int idLinea = linea.Id;
				
				cmd = new SqlCommand("VENTAS_ELIMINAR_LINEA_PEDIDO_PRODUCTO_J", ConnectionManager.getConnection());
				cmd.CommandType = CommandType.StoredProcedure;
				
				cmd.Parameters.Add("@idLinea", SqlDbType.Int);
				cmd.Parameters["@idLinea"].Value = idLinea;
								
				cmd.ExecuteNonQuery();
								
			}
			
			daoHelper = new DAOHelper(
				@"VENTAS_REGISTRAR_LINEA_PEDIDO_PRODUCTO_J 
				@idLinea int,
				@idPedidoVenta int,
				@idProducto int,
				@cantidad int,
				@precioUnitario float,
				@idDescuento int"
			);
			
			
			foreach(BELineaPedidoProducto l in v.LineasPedidoProducto){
				int idDescuento = -1;
				if (l.Descuento != null){
					idDescuento = l.Descuento.Id;
				}
			
				daoHelper.ExecuteNonQuery(
				l.Id,
				v.Id,
				l.Producto.Codigo,
				l.Cantidad,
				l.PrecioUnitario,
				idDescuento);
				
			}

			//falta foreach de LINEA SERVICIOS
			
			//Primero eliminar
			daoHelper = new DAOHelper(
				@"VENTAS_ELIMINAR_LINEA_PEDIDO_SERVICIO_J 
				@idLinea int");
			
			foreach(BELineaPedidoServicio linea in lineasServElim){
				daoHelper.ExecuteNonQuery(linea.Id);
			}
			
			
			daoHelper = new DAOHelper(
				@"VENTAS_REGISTRAR_LINEA_PEDIDO_SERVICIO_J 
				@idLinea int,
				@idPedidoVenta int,
				@idServicio int,
				@fecha DATETIME,
				@idMascota int,
				@idEmpleado int,
				@idTienda int,
				@precio float,
				@idDescuento int"
			);
			
			
			foreach(BELineaPedidoServicio l in v.LineasPedidoServicio){
				
				int idDescuento = -1;
				if (l.Descuento != null){
					idDescuento = l.Descuento.Id;
				}
				
				daoHelper.ExecuteNonQuery(
				l.Id,
				v.Id,
				l.Servicio.Codigo,
				l.Fecha,
				l.Mascota.Id,
				l.Empleado.IdEmpleado,
				l.Tienda.Id,
				l.Precio,
				idDescuento);
			}
						
		}
		
		public static string pagaPedidoVenta (BEPedidoVenta pedido,float efectivo,float tarjeta,
		                                    string moneda, char tipo,BEEmpleado emp,string ruc, string razon){
			
			object estadoTran;
			try
			{
				SqlCommand cmd = new SqlCommand("VENTAS_PAGA_PEDIDO_Z", ConnectionManager.getConnection());
				cmd.CommandType = CommandType.StoredProcedure;
				cmd.Parameters.Add("@IDPEDIDO", SqlDbType.Int);
				cmd.Parameters["@IDPEDIDO"].Value = pedido.Id;
				cmd.Parameters.Add("@EFECTIVO", SqlDbType.Float);
				cmd.Parameters["@EFECTIVO"].Value = efectivo;
				cmd.Parameters.Add("@TARJETA", SqlDbType.Float);
				cmd.Parameters["@TARJETA"].Value = tarjeta;
				
				cmd.Parameters.Add("@TOTALIN", SqlDbType.Float);
				cmd.Parameters["@TOTALIN"].Value = pedido.MontoTotal;
				cmd.Parameters.Add("@MONEDA", SqlDbType.VarChar,3);
				cmd.Parameters["@MONEDA"].Value = moneda;
				
			/*	@IDPEDIDO INT,
@EFECTIVO FLOAT,
@TARJETA FLOAT,
@TOTALIN FLOAT,
@MONEDA varchar(3),
@TIPO char(1),*/
				
				cmd.Parameters.Add("@TIPO", SqlDbType.Char);
				cmd.Parameters["@TIPO"].Value = tipo;
				cmd.Parameters.Add("@DESCUENTO", SqlDbType.Float);
				cmd.Parameters["@DESCUENTO"].Value = (pedido.MontoTotalSinDescuento - pedido.MontoTotal );
				//@IDEMPLEADO
				cmd.Parameters.Add("@IDEMPLEADO", SqlDbType.Int);
				cmd.Parameters["@IDEMPLEADO"].Value = emp.IdEmpleado;
				
				cmd.Parameters.Add("@RUC", SqlDbType.VarChar,11);
				cmd.Parameters["@RUC"].Value = ruc;
				
				cmd.Parameters.Add("@RAZON", SqlDbType.VarChar,50);
				cmd.Parameters["@RAZON"].Value = razon;
				cmd.Parameters.Add("@ESTADOTRAN", SqlDbType.Int);
				cmd.Parameters["@ESTADOTRAN"].Direction = ParameterDirection.Output;
		
				SqlDataReader reader = cmd.ExecuteReader();			
				estadoTran = cmd.Parameters["@ESTADOTRAN"].Value;
			
				int serie=-1;
				int numero=-1;
				if (reader.HasRows) 
				{
					while(reader.Read())
					{
						serie=Int32.Parse(reader[0].ToString());
						numero=Int32.Parse(reader[1].ToString());
						
					}
					reader.Close();
					//return "" ;
					if (numero!=-1 && serie!=-1){
						return "El documento de pago es:  "+string.Format("{0} - {1}",serie.ToString("000"), numero.ToString("0000000"));
					}
					else
						return "";
				}
				else
				{
					reader.Close();
					return "";
				}
			}
			catch (Exception e ){
				MessageBox.Show("No se pudo generar el documento de pago ");
				return "";
			}
		}
		
	}
}
